﻿namespace Core.Library
{
    public struct StatusStruct
    {
        public int Status { get; set; }
        public int Priority { get; set; }
        public string StatusName { get; set; }
    }
    public class StatusHelper
    {
        public const int IsDraft = 1;        
        public const int IsWaitingForPublish = 2;
        public const int IsReturned = 4;
        public const int IsPublished = 8;
        public const int IsRemoved = 16;
        public const int IsDeleted = 32;
        public const int IsHighlight = 64;

        public const int IsHot = 1;
        public const int IsNew = 2;

        private static readonly int[] _statusArray = new int[] { 1, 2, 4, 8, 16, 32, 64 };        

        //public void AddStatus(int s) { if ((Status & s) != s) Status += s; }

        //public void RemoveStatus(int s) { if ((Status & s) == s) Status -= s; }

        //public bool IsSet(int s) { return (Status & s) == s; }

        //public void ChangePublishStatus(int s)
        //{
        //    foreach (var t in _statusArray)
        //        RemoveStatus(t);
        //    AddStatus(s);
        //}

        //public static void ChangePublishStatus(int currentStatus)
        //{
        //    foreach (var t in _statusArray)
        //        UnCheck(t);
        //    Check()
                
                
            
        //}

        /// <summary>
        /// kiểm tra xem với trạng thái hiện tại currentStatus thì trạng thái checkStatus có được check hay ko
        /// vd: 
        /// currentStatus = 1 + 2 + 4 + 8 = 15 --> bit:1111 
        /// checkStatus = 8 --> bit 1000
        /// trả lại true
        /// </summary>
        /// <param name="targetStatus">có thể là 1 trạng thái (0001 / 0010 / 0100 / 1000) hay nhiều trạng thái (1111)</param>
        /// <param name="currentStatus"></param>
        /// <returns></returns>
        public static bool IsChecked(int currentStatus, int targetStatus)
        {
            var temp = targetStatus & currentStatus;
            return temp == targetStatus;
        }

        /// <summary>
        /// trả lại trạng thái đã bỏ targetStatus
        /// vd:
        /// currentStatus = 1 + 2 + 4 + 8 = 15 --> bit:1111 
        /// targetStatus = 4 --> bit:0100
        /// trả lại: 11 --> bit:1011
        /// </summary>
        /// <param name="targetStatus"></param>
        /// <param name="currentStatus"></param>
        /// <returns></returns>
        public static int UnCheck(int currentStatus, int targetStatus)
        {
            if (IsChecked(currentStatus, targetStatus))
                return currentStatus - targetStatus;
            return currentStatus;
        }

        /// <summary>
        /// trả lại trạng thái đã thêm checkStatus
        /// vd:
        /// currentStatus = 1 + 2 + 8 = 11 --> bit:1011 
        /// checkStatus = 4 --> bit:0100
        /// trả lại: 15 --> bit:1111
        /// </summary>
        /// <param name="targetStatus"></param>
        /// <param name="currentStatus"></param>
        /// <returns></returns>
        public static int Check(int currentStatus, int targetStatus)
        {
            if (!IsChecked(currentStatus, targetStatus))
                return currentStatus + targetStatus;
            return currentStatus;
        }                
    }
}